#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "infodialog.h"
#include "logic.h"
#include <QRunnable>
#include <QThreadPool>
#include <QDesktopServices>
#include <QDir>
#include <QMessageBox>
// class TaskThread : public QRunnable
// {
//     void run() override
//     {
//         qDebug() << "Hello world from thread";
//         Logic::getInstance()->walk(nullptr);
//     }
// };



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    refresh();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::showDialog(int type){
    InfoDialog dlg(this);

    connect(&dlg, &InfoDialog::ev, this, &MainWindow::evFromDialog);

    //
    //connect(Logic::getInstance(), &InfoDialog::ev, this, &MainWindow::evFromDialog);

    dlg.setType(type);
    dlg.show();
    dlg.exec();
}

void MainWindow::on_btnStart_clicked()
{
    ui->btnStart->setVisible(false);
    ui->btnRemoveDir->setVisible(false);
    ui->state->setText("正在进行中,请稍后...");
    ui->result->setText("正在进行中,请稍后...");
    // TaskThread* task = new TaskThread();
    // Logic::getInstance()->output = [this](QString result){
    //     qDebug() << "thiread" << result;
    //     ui->result->append(result);
    // };
    // QThreadPool::globalInstance()->start(task);

    ui->btnOpen->setVisible(false);
    Logic::getInstance()->walk([this](QString text,int type){
        if(type == 1 || type==2){
            if(type == 2){
                ui->btnOpen->setVisible(true);
                ui->btnRemoveDir->setVisible(true);
            }
            updateOutput(text);
        }else{
            ui->state->setText(text);
        }
        repaint();
    });

    ui->btnStart->setVisible(true);
    updateInfo(true);
}

void MainWindow::on_btnAdd_clicked()
{
    showDialog(InfoDlgType::ADD_ITEM);
}


void MainWindow::on_btnModify_clicked()
{
    showDialog(InfoDlgType::MODIFY);
}


void MainWindow::on_btnDelete_clicked()
{
    showDialog(InfoDlgType::DELETE);
}


void MainWindow::on_options_currentIndexChanged(int index)
{
    qDebug()<<index;
    Logic::getInstance()->setCurIndex(index);
    updateInfo();
}

void MainWindow::evFromDialog(int type){
    qDebug()<<"ev from dialog" << type;
    refresh();
}

void MainWindow::refresh(){
    ui->options->clear();
    ui->btnOpen->setVisible(false);
    ui->btnRemoveDir->setVisible(false);
    auto list = Logic::getInstance()->getItems();

    auto it = list.constBegin();
    while (it != list.constEnd()) {
        QJsonValue value = *it;
         ui->options->addItem(value.toObject().value("name").toString());
        // 可以根据需要处理其他类型
        ++it;
    }

    ui->options->setCurrentIndex(Logic::getInstance()->getCurIndex());

    updateInfo();
}

void MainWindow::updateInfo(bool noClear){
    auto list = Logic::getInstance()->getItems();
    auto idx = Logic::getInstance()->getCurIndex();
    auto curMd5info = Logic::getInstance()->getCurMd5info();
    if(list.size() <= 0){
        on_btnIndro_clicked();
        return;
    }
    auto item = list[idx].toObject();

    QString info = "名称：" + item.value("name").toString() +
                   "\n路径：" +item.value("dir").toString();

    if(item.value("filter").toString().length() > 0){
        info +="\n筛选：" +item.value("filter").toString();
    }

    if(item.value("url").toString().length() > 0){
         info +="\nURL：" + item.value("url").toString();
    }

    if(item.value("comment").toString().length() > 0){
        info +="\n备注：" +item.value("comment").toString();
    }

    if(curMd5info != nullptr){
        info += "\n\n最后提取时间：" + curMd5info->value("datetime").toString("");
        info += "\n版本号：" + QString::number(curMd5info->value("serial").toInt(0));
    }
    ui->info->setText(info);
    if(!noClear){
        ui->result->setText("");
    }
}


void MainWindow::updateOutput(QString &result){
    ui->result->append(result);
}

void MainWindow::on_btnIndro_clicked()
{
    QString indro = "  【使用说明】该工具将根据指定的文件夹，检测文件是否有内容变更，生成新的版本信息并选取变更文件。主要用途筛选需要上传服务器的热更新文件\n";
    indro += "\n配置说明:\n名称：指定一个名称不能重复，需要英文字母\n路径：指定需要选取比对选取的路径\n筛选：若指定，则匹配第一层目录或者文件，不匹配的将进行过滤。‘*’表示通配符\n";
    indro += "      例如：\n      *.txt 指定第一层目录下所有.txt文件\n      assets 指定目录或文件包含'assets'字符的进行比较\n      指定多个条件用逗号分割\n";
    indro += "URL：生成的目录会有hotpick.json版本文件。若改文件上传到服务器，则可设置该文件的url地址，后续比对将根据服务器的版本信息进行比对\n";
    indro += "备注：hotpick.json文件没有实际用途，仅用作必要记录之用\n";
    indro += "\n【注意事项】首次使用请先根据配置说明，增加配置;\n每个配置第一次提取，只会生成版本文件保存在程序目录versions文件夹中。";
    indro += "\n每次提取前不会删除已生成的目录，若有文件与旧文件相同则会替换为最新。若已上传至服务器，避免下次更新时文件重复可点击'删除'按钮；文件将移至备份目录，只会保留最新一份";
    indro += "\n提取完成后，点击'查看'将打开生成的目录";
    ui->result->setText(indro);
}


void MainWindow::on_btnOpen_clicked()
{
    QUrl url(QString("file:///%1").arg(Logic::getInstance()->getDistDir()));
    QDesktopServices::openUrl(url);
}


void MainWindow::on_btnRemoveDir_clicked()
{
    QString temp = Logic::getInstance()->bakDistDir();
    updateOutput(temp);
    ui->btnRemoveDir->setVisible(false);
    ui->btnOpen->setVisible(false);
    // QMessageBox::StandardButton reply;
    // reply = QMessageBox::question(this, "确认", "你确定要继续吗？",
    //                               QMessageBox::Yes | QMessageBox::No);

    // if (reply == QMessageBox::Yes) {
    //     // 用户点击了“是”
    //     Logic::getInstance()->bakDistDir();
    // } else {
    //     // 用户点击了“否”或其他按钮
    // }

}

